/**
 * @author:albert
 */

package com.bkbw.live.common.net.codec;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;

import com.bkbw.live.battle.net.codec.PackageHead;
import com.bkbw.live.battle.net.message.MessageObject;

public class NetDecoder extends CumulativeProtocolDecoder {

    protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
    	// prefixedDataAvailable非常智能，其中第一个参数可以是1，2，4，表示存储消息长度有多少个字节，分别对应byte，short，int，这里我们用int
    	// 传入4表示消息长度是一个int，该函数会先预读一个int的消息长度，然后判断这个长度是否大于等于当前缓冲区总长度，
    	// 如果是，表明一个完整的包在缓冲区中了，就可以整个读取，否则返回false不予读取。
    	if (in.prefixedDataAvailable(4,65535)) {
    		
			//先读取4个字节作为长度
			int len = in.getInt();
			//System.out.println("mina+++ read len "+ len);
			//然后读取2个字节作为消息头
			short head = in.getShort();
			//System.out.println("收到消息"+head);
			//根据长度来创建字节数组
			byte[] bytes = new byte[len-2];
			//读取二进制数据
			in.get(bytes);
			RawMessageObject rawMessageObject = new RawMessageObject(head, bytes, session);
			out.write(rawMessageObject);
			//..根据不同的消息头来进行反序列化,这里使用了Java的反射机制
//			Class c = Class.forName(PackageHead.getClassNameByHead(head));
//			java.lang.reflect.Method m = c.getMethod("parseFrom", byte[].class);
//			Object tt = m.invoke(null,bytes);
//			//把proto对象和消息头合并为MessageObject往下传递
//			MessageObject mo = new MessageObject(head,tt,session);
//			out.write(mo);
			return true;
        } else {
            // not enough data available to read second image
            return false;
        }
    }
}
